package com.File;

import com.File.mojo.Person;
import org.junit.Test;

import java.io.*;

/**
 * 对象流的使用
 * 1.ObjectInputStream 和 ObjectOutputStream
 * 2.作用:用于存取或读取基本数据类型或对象的处理流。
 * 它的强大之处就是可以把java中的对象写入到数据源中,也能把对象从数据源中欢迎回来
 *
 * 3.要想一个java对象是可序列化的，需要满足相应的要求。详情请见Person.java
 */
public class ObjectInputOutputStreamTest {

    /**
     * 序列化的过程，将内存中的java对象保存到磁盘中，或者通过网络传输出去。
     * 使用ObjectOutputStream实现。
     */
    @Test
    public void testObjectOutputStream() {
        /**
         * dat并不是一种标准文件。许多文件都使用这个扩展名，但文件含义不同。而许多数据分析软件也用这个扩展名保存数据。所以这要看具体的软件情况来定。DAT文件，可以按照扩展名来看就是DATA的意思，
         *  即数据文件，这类文件并没有进行绝对化的定义，例如VCD光盘中的dat文件就可以用一般的视频播放器打开，而QQ的dat文件中则存储了用户信息，是不能使用常规方式打开的，只有QQ程序可以访问。
         *  还有一些其他程序都有自己对dat文件的定义，要通过产生它的程序来打开与之相关联的dat文件。
         */
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.dat"));

            objectOutputStream.writeObject(new String("我爱北京天安门"));

            objectOutputStream.flush(); //刷新操作
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != objectOutputStream) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    //反序列化的过程:将磁盘文件中的对象还原为内存中的一个java对象
    //使用ObjectInputStream来实现
    @Test
    public void ObjectInputStream() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("object.dat"));

        Object object = objectInputStream.readObject();
        //在知道object是什么对象时，可以进行强制转换
        String str = (String) object;

        System.out.println(str);

        objectInputStream.close();


    }

    //自定义序列化过程
    @Test
    public void CustomSerializeTest() {
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream("Person.dat"));

            objectOutputStream.writeObject(new Person("薛虎", 22));

            objectOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null != objectOutputStream) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }

    //自定义反序列化过程
    @Test
    public void CustomDeSerialization() {
        ObjectInputStream objectInputStream = null;

        try {
            objectInputStream = new ObjectInputStream(new FileInputStream("Person.dat"));

            Object object = objectInputStream.readObject();
            Person object1 = (Person) object;
            System.out.println(object1);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if(null != objectInputStream) {
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }




    }

}
